package com.yugao.fintech.antelope.mps.model.entity;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.yugao.fintech.antelope.base.model.BasePO;
import com.yugao.fintech.antelope.mps.api.constatnts.ChannelTypeEnum;
import com.yugao.fintech.antelope.mps.api.model.content.template.TemplateVarData;
import com.yugao.fintech.antelope.base.tenant.core.DataIsolation;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.List;

/**
 * 消息推送
 *

 */
@Getter
@Setter
@Accessors(chain = true)
@TableName(value = "mps_msg_history", autoResultMap = true)
@DataIsolation(filterTenant = true, tableName = "mps_msg_history")
public class MsgHistory extends BasePO {

    public static LambdaQueryWrapper<MsgHistory> lqw() {
        return Wrappers.lambdaQuery();
    }

    @TableId
    private Long id;

    /**
     * 模板ID
     */
    private Long templateId;

    /**
     * 消息推送任务id
     * @see MsgPushTask#getId()
     */
    private Long taskId;

    /**
     * 消息重试次数
     */
    private Integer retryCount;

    /**
     * 原始模板遍历, 用户请求的
     */
    @TableField(typeHandler = TemplateDataHandler.class)
    private List<TemplateVarData> originalTemplateVar;

    /**
     * 渠道类型
     * @see ChannelTypeEnum
     */
    private String channelType;

    /**
     * 渠道编码
     */
    private String channelCode;

    /**
     * 消息组id
     */
    private Long groupId;

    /**
     * 消息组名称
     */
    private String groupName;

    /**
     * 消息推送的状态
     */
    private String status;

    /**
     * 推送结果, 可以存放推送组件返回值或者异常信息
     */
    private String pushResult;

    /**
     * 推送时间
     */
    private Date pushTime;

    /**
     * 业务主键
     */
    private String bizKey;

    /**
     * 业务类型
     */
    private String bizType;

    /**
     * 接受者用户编码，可直接指定接受者手机号或邮箱地址等
     */
    private String toUser;

    public MsgHistory() {
        this.retryCount = 0;
    }

    public static class TemplateDataHandler extends AbstractJsonTypeHandler<List<TemplateVarData>> {

        @Override
        protected List<TemplateVarData> parse(String json) {
            return JSON.parseArray(json, TemplateVarData.class);
        }

        @Override
        protected String toJson(List<TemplateVarData> obj) {
            return JSON.toJSONString(obj).trim();
        }
    }
}